# -*- coding: utf-8 -*-
"""
    Time    : 2020/12/23 10:43 下午
    Author  : Thinkgamer
    File    : 347-前K个高频元素.py
    Desc    : https://leetcode-cn.com/problems/top-k-frequent-elements/
"""
"""
给定一个非空的整数数组，返回其中出现频率前k高的元素。

示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:
输入: nums = [1], k = 1
输出: [1]

提示：
你可以假设给定的 k 总是合理的，且 1 ≤ k ≤ 数组中不相同的元素的个数。
你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
题目数据保证答案唯一，换句话说，数组中前 k 个高频元素的集合是唯一的。
你可以按任意顺序返回答案。
"""
"""
	思路v1: 扫描一遍，赋值给字典，排序输出 top k
	思路v2: 基于优先级队列来做
"""


# 32 ms 73.78% | 14.6 MB 70.69%
def top_k_frequent_v1(nums, k):
	from collections import Counter
	count_dict = Counter(nums)
	return list(map(lambda l: l[0], sorted(count_dict.items(), key=lambda k: k[1], reverse=True)[:k]))


# 52 ms 61.91% | 17.4 MB 11.08%
def top_k_frequent_v2(nums, k):
	# 统计频次
	from collections import Counter
	count_dict = Counter(nums)
	
	import queue as Q
	# 维护一个最小堆2
	q = Q.PriorityQueue()
	
	for num, count in count_dict.items():
		q.put((-count, num))
	return [q.get()[1] for i in range(k)]


nums = [1, 2, 1, 1, 3, 2]
k = 2
# nums = [1]
# k = 1
result = top_k_frequent_v2(nums, k)
print(result)
